关于原码、反码和补码 |
您所在的位置:网站首页 › 土壤指数 遥感 › 关于原码、反码和补码 |
一、原码的定义
原码、反码和补码都是计算机中对数字的二进制定点表示方法。 原码表示法的最高位是符号位,0表示正,1表示负。其具体定义分为小数和正数定义,这里我们暂时只讨论整数的相关定义: 这里假设用1个字节来表示整数X,那么一共可以表示256个不同的X: 当X在[0,127]时,X的原码就是X; 当X在[-127,-0]时,X的原码就是128-X。 有以下需要注意的地方: 零的表示有两个:正零和负零,分别为0000 0000和1000 0000; 最大正数为127,最小负数为-127,加上正零和负零,一共256个数; +0 0000 0000 +1 0000 0001 +2 0000 0010 +127 0111 1111 -0 1000 0000 -1 1000 0001 -127 1111 1111 二、反码的定义 正数的反码:与原码相同 负数的反码:最高位符号位不变,保持为1,其它各位按位取反,即:0变1,1变0。 它的表示范围同原码相同:[-127,+127],+0和-0的表示也不相同,分别为0000 0000和1111 1111。 三、补码的定义 正数的补码:与原码相同 负数的补码:反码+1 正零和负零的表示完全相同:0000 0000,原因很简单:正数零的反码就是零的原码,0000 0000,这没有问题;负数零的补码是其反码加1,而其反码前面已经提到,是1111 1111,它加1之后应为1 0000 0000,但是我们前面既然已经声明用1个字节来举例表示整数 ,那么最高位的1就会被舍去,因此结果也是0000 0000。 它的表示范围已经改变:[-128,+127],为何可以表示-128了呢,原因如下: 1个字节本来可以表示256个不同的数,但是现在正零和负零已经相同了,那么肯定剩下一个数没有用到,这个数就是1000 0000,可以验证:[-127,+127]中没有哪个数的补码会是这个数,原因很简单,我们可以根据这个补码求它的原码,过程如下: 首先,假设它是正数的补码。因为正数的原码、反码、补码完全相同,因此如果它是正数,那么它的原码就是它的补码,那么因此原码也是1000 0000,但我们根据原码的定义可知,最高位为1表示负数,因此自相矛盾,所以假设错误,得出结论:它不是正数; 其次,假设它是负数的补码。那么它减1就会得到其反码为0111 1111,这样也不正确,因为一个负数的反码的最高位也应该是1,也自相矛盾,所以它也不是负数的原码; 最后它只能是零的补码了,可我们已经知道正零和负零的补码相同,均为0000 0000,因此它也不是零的补码。 综上所述,它不是[-127,+127]中任何一个数的补码,那么它不就浪费了吗?为了避免浪费,我们特别地规定:1000 0000是-128的补码。 +0 0000 0000 +1 0000 0001 +2 0000 0010 +127 0111 1111 -128 1000 0000 -127 1000 0001 -1 1111 1111 所以在补码的世界里,由0开始逐渐递增,直到最大的正数后,如再加1,则跳变到最小的负数,之后又逐渐递增,直到变为最大的负数。
原码的变化图 补码的变化图 在计算机中数都是采用补码表示,原因有二:一是原码和反码对零的表示都不相同,因此这不合数学逻辑,不适合进行数的运算,而且它们还需要对符号位做特殊处理;而补码首先对零的表示是唯一的,其次它不需要对符号位作特殊的处理,也就是符号位可以直接参与运算,补码还可以把减法当成加法来处理。 补码的运算法则:[A+B]补 = [A]补 + [B]补 因此可推导出::[A-B]补 = [A+(-B)]补 = [A]补 + [-B]补 关于负数的补码如何求的问题,包括其中涉及的进位或溢出等,以后再学习吧。 四、Java中的int型变量的讨论 Java中的数都是有符号数。int型变量用4个字节来表示,因此最大值是2的31次减1,最小值是负的2的31次。
|
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |